#include <iostream>
#include <vector>
#include <cmath>

using namespace std;

// 判断一个值是否接近于 0（处理浮点数误差）
bool isZero(double value, double epsilon = 1e-9) {
    return abs(value) < epsilon;
}

// 高斯消元法将矩阵化为行阶梯形
void rowEchelonForm(vector<vector<double>>& matrix) {
    int rows = matrix.size();
    int cols = matrix[0].size();

    for (int i = 0, pivotCol = 0; i < rows && pivotCol < cols; ++i, ++pivotCol) {
        // 找到当前列中第一个非零元素所在的行
        int pivotRow = i;
        while (pivotRow < rows && isZero(matrix[pivotRow][pivotCol])) {
            ++pivotRow;
        }

        if (pivotRow == rows) {
            --i; // 当前列没有主元，继续下一列
            continue;
        }

        // 交换当前行与主元行
        swap(matrix[i], matrix[pivotRow]);

        // 将当前主元归一化
        double pivotValue = matrix[i][pivotCol];
        for (int k = pivotCol; k < cols; ++k) {
            matrix[i][k] /= pivotValue;
        }

        // 消去其他行在当前列上的值
        for (int j = 0; j < rows; ++j) {
            if (j != i && !isZero(matrix[j][pivotCol])) {
                double factor = matrix[j][pivotCol];
                for (int k = pivotCol; k < cols; ++k) {
                    matrix[j][k] -= factor * matrix[i][k];
                }
            }
        }
    }
}

// 计算张成子空间的维度
int spanDimension(const vector<vector<double>>& vectors) {
    if (vectors.empty()) return 0;

    // 构造矩阵：将每个向量作为列向量
    int rows = vectors[0].size();
    int cols = vectors.size();
    vector<vector<double>> matrix(rows, vector<double>(cols, 0.0));

    for (int j = 0; j < cols; ++j) {
        for (int i = 0; i < rows; ++i) {
            matrix[i][j] = vectors[j][i];
        }
    }

    // 对矩阵进行高斯消元
    rowEchelonForm(matrix);

    // 统计主元列数量
    int rank = 0;
    for (int i = 0; i < rows && i < cols; ++i) {
        if (!isZero(matrix[i][i])) {
            ++rank;
        }
    }

    return rank;
}

int main() {
    // 定义一组向量
    vector<vector<double>> vectors = {
        {1, 2, 3},
        {4, 5, 6},
        {7, 8, 9}
    };

    // 计算张成子空间的维度
    int dimension = spanDimension(vectors);
    cout << "张成子空间的维度是: " << dimension << endl;

    return 0;
}